/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import Foundation

/**
 Object for wrapping any element inside a class. This is specifically being used for
 implementing efficient copy-on-write functionality within custom structs. It allows us to
 check if the target element is being referenced by multiple objects via
 `isUniquelyReferencedNonObjC(:)` and to only perform copies if this check returns true.

 For an example of usage, see `WeakSet`.
 */
internal final class WrapperBox<Element> {
  // MARK: - Properties

  /// The element that was boxed
  let unbox: Element

  // MARK: - Initializers

  init(_ element: Element) {
    unbox = element
  }
}
